From 0fefdc99b263fbe136bb058e5e64c7aacde7da61 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Fri, 5 Jun 2020 20:27:28 +0100 Subject: [PATCH] a11y: Simplify GtkEntryAccessible Now that we don't have any additional subclasses of GtkEntryAccessible in GTK, we can drop all the conditional fluff in the base class. We still need to subscribe to the global notify signal, because of the sheer amount of properties watched by GtkEntryAccessible. --- gtk/a11y/gtkentryaccessible.c | 423 +++++++++++++++------------------- 1 file changed, 190 insertions(+), 233 deletions(-) diff --git a/gtk/a11y/gtkentryaccessible.c b/gtk/a11y/gtkentryaccessible.c index fc33f5b6f3..f8a874833c 100644 --- a/gtk/a11y/gtkentryaccessible.c +++ b/gtk/a11y/gtkentryaccessible.c @@ -24,7 +24,6 @@ #include "gtkentryprivate.h" #include "gtklabel.h" #include "gtkpango.h" -#include "gtksearchentryprivate.h" #include "gtkstylecontextprivate.h" #include "gtktextprivate.h" #include "gtkwidgetprivate.h" @@ -159,7 +158,7 @@ gtk_entry_icon_accessible_ref_state_set (AtkObject *accessible) if (!entry_set || atk_state_set_contains_state (entry_set, ATK_STATE_DEFUNCT)) { atk_state_set_add_state (set, ATK_STATE_DEFUNCT); - g_clear_object (&entry_set); + g_clear_object (&entry_set); return set; } @@ -358,15 +357,6 @@ icon_atk_component_interface_init (AtkComponentIface *iface) } /* Callbacks */ - -static void insert_text_cb (GtkEditable *editable, - gchar *new_text, - gint new_text_length, - gint *position); -static void delete_text_cb (GtkEditable *editable, - gint start, - gint end); - static gboolean check_for_selection_change (GtkEntryAccessible *entry, GtkEditable *editable); @@ -382,106 +372,121 @@ G_DEFINE_TYPE_WITH_CODE (GtkEntryAccessible, gtk_entry_accessible, GTK_TYPE_WIDG G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, atk_text_interface_init) G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)) - -static AtkStateSet * -gtk_entry_accessible_ref_state_set (AtkObject *accessible) +static GtkText * +get_text (AtkText *atk_text) { - AtkStateSet *state_set; - gboolean value; GtkWidget *widget; - GtkWidget *text; - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_text)); if (widget == NULL) return NULL; - text = gtk_widget_get_first_child (widget); - - state_set = ATK_OBJECT_CLASS (gtk_entry_accessible_parent_class)->ref_state_set (accessible); - - atk_state_set_add_state (state_set, ATK_STATE_FOCUSABLE); - if (gtk_widget_has_focus (text)) - atk_state_set_add_state (state_set, ATK_STATE_FOCUSED); - - g_object_get (G_OBJECT (widget), "editable", &value, NULL); - if (value) - atk_state_set_add_state (state_set, ATK_STATE_EDITABLE); - atk_state_set_add_state (state_set, ATK_STATE_SINGLE_LINE); - - return state_set; + return gtk_entry_get_text_widget (GTK_ENTRY (widget)); } -static AtkAttributeSet * -gtk_entry_accessible_get_attributes (AtkObject *accessible) +static gboolean +check_for_selection_change (GtkEntryAccessible *accessible, + GtkEditable *editable) { - GtkWidget *widget; - AtkAttributeSet *attributes; - AtkAttribute *placeholder_text; - char *text = NULL; + gboolean ret_val = FALSE; + gint start, end; - attributes = ATK_OBJECT_CLASS (gtk_entry_accessible_parent_class)->get_attributes (accessible); + if (gtk_editable_get_selection_bounds (editable, &start, &end)) + { + if (end != accessible->priv->cursor_position || + start != accessible->priv->selection_bound) + /* + * This check is here as this function can be called + * for notification of selection_bound and current_pos. + * The values of current_pos and selection_bound may be the same + * for both notifications and we only want to generate one + * text_selection_changed signal. + */ + ret_val = TRUE; + } + else + { + /* We had a selection */ + ret_val = (accessible->priv->cursor_position != accessible->priv->selection_bound); + } - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); - if (widget == NULL) - return attributes; + accessible->priv->cursor_position = end; + accessible->priv->selection_bound = start; - /* Subclasses of GtkEntryAccessible will chain up, so we need to protect - * the placeholder-text property access - */ - if (GTK_IS_ENTRY (widget)) - g_object_get (widget, "placeholder-text", &text, NULL); + return ret_val; +} - if (text == NULL) - return attributes; +static void +insert_text_cb (GtkEditable *editable, + gchar *new_text, + gint new_text_length, + gint *position, + GtkEntryAccessible *self) +{ + int length; - placeholder_text = g_malloc (sizeof (AtkAttribute)); - placeholder_text->name = g_strdup ("placeholder-text"); - placeholder_text->value = text; + if (new_text_length == 0) + return; - attributes = g_slist_append (attributes, placeholder_text); + length = g_utf8_strlen (new_text, new_text_length); - return attributes; + g_signal_emit_by_name (self, + "text-changed::insert", + *position - length, + length); } +/* We connect to GtkEditable::delete-text, since it carries + * the information we need. But we delay emitting our own + * text_changed::delete signal until the entry has update + * all its internal state and emits GtkEntry::changed. + */ static void -gtk_entry_accessible_initialize (AtkObject *obj, - gpointer data) +delete_text_cb (GtkEditable *editable, + gint start, + gint end, + GtkEntryAccessible *self) { - GtkWidget *widget; - GtkEntryAccessible *gtk_entry_accessible; - gint start_pos, end_pos; + GtkText *textw; - ATK_OBJECT_CLASS (gtk_entry_accessible_parent_class)->initialize (obj, data); + textw = get_text (ATK_TEXT (self)); + if (textw == NULL) + return; - gtk_entry_accessible = GTK_ENTRY_ACCESSIBLE (obj); + if (end < 0) + { + gchar *text; - widget = GTK_WIDGET (data); - gtk_editable_get_selection_bounds (GTK_EDITABLE (widget), &start_pos, &end_pos); - gtk_entry_accessible->priv->cursor_position = end_pos; - gtk_entry_accessible->priv->selection_bound = start_pos; + text = gtk_text_get_display_text (textw, 0, -1); + end = g_utf8_strlen (text, -1); + g_free (text); + } - /* Set up signal callbacks */ - g_signal_connect_after (widget, "insert-text", G_CALLBACK (insert_text_cb), NULL); - g_signal_connect (widget, "delete-text", G_CALLBACK (delete_text_cb), NULL); + if (end == start) + return; + + g_signal_emit_by_name (self, + "text-changed::delete", + start, + end - start); } static void -gtk_entry_accessible_notify_gtk (GObject *obj, - GParamSpec *pspec) +on_notify (GObject *gobject, + GParamSpec *pspec, + GtkEntryAccessible *self) { GtkWidget *widget; AtkObject* atk_obj; - GtkEntryAccessible* entry; GtkEntryAccessiblePrivate *priv; - widget = GTK_WIDGET (obj); + widget = GTK_WIDGET (gobject); atk_obj = gtk_widget_get_accessible (widget); - entry = GTK_ENTRY_ACCESSIBLE (atk_obj); - priv = entry->priv; + priv = gtk_entry_accessible_get_instance_private (self); if (g_strcmp0 (pspec->name, "cursor-position") == 0) { - if (check_for_selection_change (entry, GTK_EDITABLE (widget))) + if (check_for_selection_change (self, GTK_EDITABLE (widget))) g_signal_emit_by_name (atk_obj, "text-selection-changed"); /* * The entry cursor position has moved so generate the signal. @@ -491,19 +496,17 @@ gtk_entry_accessible_notify_gtk (GObject *obj, } else if (g_strcmp0 (pspec->name, "selection-bound") == 0) { - if (check_for_selection_change (entry, GTK_EDITABLE (widget))) + if (check_for_selection_change (self, GTK_EDITABLE (widget))) g_signal_emit_by_name (atk_obj, "text-selection-changed"); } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "editable") == 0) + else if (g_strcmp0 (pspec->name, "editable") == 0) { gboolean value; - g_object_get (obj, "editable", &value, NULL); + g_object_get (gobject, "editable", &value, NULL); atk_object_notify_state_change (atk_obj, ATK_STATE_EDITABLE, value); } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "visibility") == 0) + else if (g_strcmp0 (pspec->name, "visibility") == 0) { gboolean visibility; AtkRole new_role; @@ -512,43 +515,44 @@ gtk_entry_accessible_notify_gtk (GObject *obj, new_role = visibility ? ATK_ROLE_TEXT : ATK_ROLE_PASSWORD_TEXT; atk_object_set_role (atk_obj, new_role); } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "primary-icon-storage-type") == 0) + else if (g_strcmp0 (pspec->name, "primary-icon-storage-type") == 0) { - if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_PRIMARY) != GTK_IMAGE_EMPTY && !priv->icons[GTK_ENTRY_ICON_PRIMARY]) + if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_PRIMARY) != GTK_IMAGE_EMPTY && + !priv->icons[GTK_ENTRY_ICON_PRIMARY]) { - priv->icons[GTK_ENTRY_ICON_PRIMARY] = gtk_entry_icon_accessible_new (entry, GTK_ENTRY_ICON_PRIMARY); - g_signal_emit_by_name (entry, "children-changed::add", 0, + priv->icons[GTK_ENTRY_ICON_PRIMARY] = gtk_entry_icon_accessible_new (self, GTK_ENTRY_ICON_PRIMARY); + g_signal_emit_by_name (self, "children-changed::add", 0, priv->icons[GTK_ENTRY_ICON_PRIMARY], NULL); } - else if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_PRIMARY) == GTK_IMAGE_EMPTY && priv->icons[GTK_ENTRY_ICON_PRIMARY]) + else if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_PRIMARY) == GTK_IMAGE_EMPTY && + priv->icons[GTK_ENTRY_ICON_PRIMARY]) { gtk_entry_icon_accessible_invalidate (GTK_ENTRY_ICON_ACCESSIBLE (priv->icons[GTK_ENTRY_ICON_PRIMARY])); - g_signal_emit_by_name (entry, "children-changed::remove", 0, + g_signal_emit_by_name (self, "children-changed::remove", 0, priv->icons[GTK_ENTRY_ICON_PRIMARY], NULL); g_clear_object (&priv->icons[GTK_ENTRY_ICON_PRIMARY]); } } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "secondary-icon-storage-type") == 0) + else if (g_strcmp0 (pspec->name, "secondary-icon-storage-type") == 0) { gint index = (priv->icons[GTK_ENTRY_ICON_PRIMARY] ? 1 : 0); - if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY) != GTK_IMAGE_EMPTY && !priv->icons[GTK_ENTRY_ICON_SECONDARY]) + if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY) != GTK_IMAGE_EMPTY && + !priv->icons[GTK_ENTRY_ICON_SECONDARY]) { - priv->icons[GTK_ENTRY_ICON_SECONDARY] = gtk_entry_icon_accessible_new (entry, GTK_ENTRY_ICON_SECONDARY); - g_signal_emit_by_name (entry, "children-changed::add", index, + priv->icons[GTK_ENTRY_ICON_SECONDARY] = gtk_entry_icon_accessible_new (self, GTK_ENTRY_ICON_SECONDARY); + g_signal_emit_by_name (self, "children-changed::add", index, priv->icons[GTK_ENTRY_ICON_SECONDARY], NULL); } - else if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY) == GTK_IMAGE_EMPTY && priv->icons[GTK_ENTRY_ICON_SECONDARY]) + else if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY) == GTK_IMAGE_EMPTY && + priv->icons[GTK_ENTRY_ICON_SECONDARY]) { gtk_entry_icon_accessible_invalidate (GTK_ENTRY_ICON_ACCESSIBLE (priv->icons[GTK_ENTRY_ICON_SECONDARY])); - g_signal_emit_by_name (entry, "children-changed::remove", index, + g_signal_emit_by_name (self, "children-changed::remove", index, priv->icons[GTK_ENTRY_ICON_SECONDARY], NULL); g_clear_object (&priv->icons[GTK_ENTRY_ICON_SECONDARY]); } } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "primary-icon-name") == 0) + else if (g_strcmp0 (pspec->name, "primary-icon-name") == 0) { if (priv->icons[GTK_ENTRY_ICON_PRIMARY]) { @@ -558,8 +562,7 @@ gtk_entry_accessible_notify_gtk (GObject *obj, atk_object_set_name (priv->icons[GTK_ENTRY_ICON_PRIMARY], name); } } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "secondary-icon-name") == 0) + else if (g_strcmp0 (pspec->name, "secondary-icon-name") == 0) { if (priv->icons[GTK_ENTRY_ICON_SECONDARY]) { @@ -569,8 +572,7 @@ gtk_entry_accessible_notify_gtk (GObject *obj, atk_object_set_name (priv->icons[GTK_ENTRY_ICON_SECONDARY], name); } } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "primary-icon-tooltip-text") == 0) + else if (g_strcmp0 (pspec->name, "primary-icon-tooltip-text") == 0) { if (priv->icons[GTK_ENTRY_ICON_PRIMARY]) { @@ -587,8 +589,7 @@ gtk_entry_accessible_notify_gtk (GObject *obj, } } } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "secondary-icon-tooltip-text") == 0) + else if (g_strcmp0 (pspec->name, "secondary-icon-tooltip-text") == 0) { if (priv->icons[GTK_ENTRY_ICON_SECONDARY]) { @@ -605,8 +606,7 @@ gtk_entry_accessible_notify_gtk (GObject *obj, } } } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "primary-icon-activatable") == 0) + else if (g_strcmp0 (pspec->name, "primary-icon-activatable") == 0) { if (priv->icons[GTK_ENTRY_ICON_PRIMARY]) { @@ -615,8 +615,7 @@ gtk_entry_accessible_notify_gtk (GObject *obj, ATK_STATE_ENABLED, on); } } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "secondary-icon-activatable") == 0) + else if (g_strcmp0 (pspec->name, "secondary-icon-activatable") == 0) { if (priv->icons[GTK_ENTRY_ICON_SECONDARY]) { @@ -625,8 +624,7 @@ gtk_entry_accessible_notify_gtk (GObject *obj, ATK_STATE_ENABLED, on); } } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "primary-icon-sensitive") == 0) + else if (g_strcmp0 (pspec->name, "primary-icon-sensitive") == 0) { if (priv->icons[GTK_ENTRY_ICON_PRIMARY]) { @@ -635,8 +633,7 @@ gtk_entry_accessible_notify_gtk (GObject *obj, ATK_STATE_SENSITIVE, on); } } - else if (GTK_IS_ENTRY (widget) && - g_strcmp0 (pspec->name, "secondary-icon-sensitive") == 0) + else if (g_strcmp0 (pspec->name, "secondary-icon-sensitive") == 0) { if (priv->icons[GTK_ENTRY_ICON_SECONDARY]) { @@ -645,8 +642,84 @@ gtk_entry_accessible_notify_gtk (GObject *obj, ATK_STATE_SENSITIVE, on); } } - else - GTK_WIDGET_ACCESSIBLE_CLASS (gtk_entry_accessible_parent_class)->notify_gtk (obj, pspec); +} + +static AtkStateSet * +gtk_entry_accessible_ref_state_set (AtkObject *accessible) +{ + AtkStateSet *state_set; + gboolean value; + GtkWidget *widget; + GtkWidget *text; + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (widget == NULL) + return NULL; + + text = gtk_widget_get_first_child (widget); + + state_set = ATK_OBJECT_CLASS (gtk_entry_accessible_parent_class)->ref_state_set (accessible); + + atk_state_set_add_state (state_set, ATK_STATE_FOCUSABLE); + if (gtk_widget_has_focus (text)) + atk_state_set_add_state (state_set, ATK_STATE_FOCUSED); + + g_object_get (G_OBJECT (widget), "editable", &value, NULL); + if (value) + atk_state_set_add_state (state_set, ATK_STATE_EDITABLE); + atk_state_set_add_state (state_set, ATK_STATE_SINGLE_LINE); + + return state_set; +} + +static AtkAttributeSet * +gtk_entry_accessible_get_attributes (AtkObject *accessible) +{ + GtkWidget *widget; + AtkAttributeSet *attributes; + AtkAttribute *placeholder_text; + char *text = NULL; + + attributes = ATK_OBJECT_CLASS (gtk_entry_accessible_parent_class)->get_attributes (accessible); + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); + if (widget == NULL) + return attributes; + + g_object_get (widget, "placeholder-text", &text, NULL); + if (text == NULL) + return attributes; + + placeholder_text = g_malloc (sizeof (AtkAttribute)); + placeholder_text->name = g_strdup ("placeholder-text"); + placeholder_text->value = text; + + attributes = g_slist_append (attributes, placeholder_text); + + return attributes; +} + +static void +gtk_entry_accessible_initialize (AtkObject *obj, + gpointer data) +{ + GtkWidget *widget; + GtkEntryAccessible *gtk_entry_accessible; + gint start_pos, end_pos; + + ATK_OBJECT_CLASS (gtk_entry_accessible_parent_class)->initialize (obj, data); + + gtk_entry_accessible = GTK_ENTRY_ACCESSIBLE (obj); + + widget = GTK_WIDGET (data); + gtk_editable_get_selection_bounds (GTK_EDITABLE (widget), &start_pos, &end_pos); + gtk_entry_accessible->priv->cursor_position = end_pos; + gtk_entry_accessible->priv->selection_bound = start_pos; + + /* Set up signal callbacks */ + g_signal_connect_after (widget, "insert-text", G_CALLBACK (insert_text_cb), obj); + g_signal_connect (widget, "delete-text", G_CALLBACK (delete_text_cb), obj); + g_signal_connect (widget, "notify", G_CALLBACK (on_notify), obj); } static gint @@ -673,13 +746,10 @@ gtk_entry_accessible_get_n_children (AtkObject* obj) if (widget == NULL) return 0; - if (GTK_IS_ENTRY (widget)) - { - if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_PRIMARY) != GTK_IMAGE_EMPTY) - count++; - if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY) != GTK_IMAGE_EMPTY) - count++; - } + if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_PRIMARY) != GTK_IMAGE_EMPTY) + count++; + if (gtk_entry_get_icon_storage_type (GTK_ENTRY (widget), GTK_ENTRY_ICON_SECONDARY) != GTK_IMAGE_EMPTY) + count++; return count; } @@ -697,9 +767,6 @@ gtk_entry_accessible_ref_child (AtkObject *obj, if (widget == NULL) return NULL; - if (!GTK_IS_ENTRY (widget)) - return NULL; - switch (i) { case 0: @@ -742,7 +809,6 @@ static void gtk_entry_accessible_class_init (GtkEntryAccessibleClass *klass) { AtkObjectClass *class = ATK_OBJECT_CLASS (klass); - GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass; GObjectClass *gobject_class = G_OBJECT_CLASS (klass); class->ref_state_set = gtk_entry_accessible_ref_state_set; @@ -752,8 +818,6 @@ gtk_entry_accessible_class_init (GtkEntryAccessibleClass *klass) class->get_n_children = gtk_entry_accessible_get_n_children; class->ref_child = gtk_entry_accessible_ref_child; - widget_class->notify_gtk = gtk_entry_accessible_notify_gtk; - gobject_class->finalize = gtk_entry_accessible_finalize; } @@ -767,23 +831,6 @@ gtk_entry_accessible_init (GtkEntryAccessible *entry) ATK_OBJECT (entry)->role = ATK_ROLE_TEXT; } -static GtkText * -get_text (AtkText *atk_text) -{ - GtkWidget *widget; - - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_text)); - if (widget == NULL) - return NULL; - - if (GTK_IS_ENTRY (widget)) - return gtk_entry_get_text_widget (GTK_ENTRY (widget)); - else if (GTK_IS_SEARCH_ENTRY (widget)) - return gtk_search_entry_get_text_widget (GTK_SEARCH_ENTRY (widget)); - else - return NULL; // FIXME; -} - static gchar * gtk_entry_accessible_get_text (AtkText *atk_text, gint start_pos, @@ -1379,96 +1426,6 @@ atk_editable_text_interface_init (AtkEditableTextIface *iface) iface->set_run_attributes = NULL; } -static void -insert_text_cb (GtkEditable *editable, - gchar *new_text, - gint new_text_length, - gint *position) -{ - GtkEntryAccessible *accessible; - gint length; - - if (new_text_length == 0) - return; - - accessible = GTK_ENTRY_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (editable))); - length = g_utf8_strlen (new_text, new_text_length); - - g_signal_emit_by_name (accessible, - "text-changed::insert", - *position - length, - length); -} - -/* We connect to GtkEditable::delete-text, since it carries - * the information we need. But we delay emitting our own - * text_changed::delete signal until the entry has update - * all its internal state and emits GtkEntry::changed. - */ -static void -delete_text_cb (GtkEditable *editable, - gint start, - gint end) -{ - GtkEntryAccessible *accessible; - GtkText *textw; - - accessible = GTK_ENTRY_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (editable))); - - textw = get_text (ATK_TEXT (accessible)); - if (textw == NULL) - return; - - if (end < 0) - { - gchar *text; - - text = gtk_text_get_display_text (textw, 0, -1); - end = g_utf8_strlen (text, -1); - g_free (text); - } - - if (end == start) - return; - - g_signal_emit_by_name (accessible, - "text-changed::delete", - start, - end - start); -} - -static gboolean -check_for_selection_change (GtkEntryAccessible *accessible, - GtkEditable *editable) -{ - gboolean ret_val = FALSE; - gint start, end; - - if (gtk_editable_get_selection_bounds (editable, &start, &end)) - { - if (end != accessible->priv->cursor_position || - start != accessible->priv->selection_bound) - /* - * This check is here as this function can be called - * for notification of selection_bound and current_pos. - * The values of current_pos and selection_bound may be the same - * for both notifications and we only want to generate one - * text_selection_changed signal. - */ - ret_val = TRUE; - } - else - { - /* We had a selection */ - ret_val = (accessible->priv->cursor_position != accessible->priv->selection_bound); - } - - accessible->priv->cursor_position = end; - accessible->priv->selection_bound = start; - - return ret_val; -} - static gboolean gtk_entry_accessible_do_action (AtkAction *action, gint i) -- 2.30.2